//
//  UserAccountViewModel.swift
//  weibo-01
//
//  Created by 韩家奇 on 15/11/8.
//  Copyright © 2015年 hanjiaqi. All rights reserved.
//

import UIKit
//视图模型的作用:封装业务逻辑 一般没有复杂的属性
class UserAccountViewModel {
    //单例 - 解决避免重复从沙盒加载归档文件 提高效率 让access_token便于被访问到
    static let sharedUserAccount = UserAccountViewModel()
    
    //用户模型
    var account: UserAccount?
    
    /// 返回有效的 token
    var accessToken: String? {
        
        // 如果 token 没有过期，返回 account.中的 token 属性
        if !isExpired {
            return account?.access_token
        }
        return nil
    }
    
    /// 用户登录标记
    var userLogin: Bool {
        
        // 1. 如果 token 有值，说明登录成功
        // 2. 如果没有过期，说明登录有效
        return account?.access_token != nil && !isExpired
    }
    //用户头像 URL
    var avataURL: NSURL {
        return NSURL(string: account?.avatar_large ?? "")!
    }

    // 归档保存的路径- 计算型属性 计算性属性类似于有返回值的函数 可以让调用的时候语义更清晰
    //如果在OC中 可以通过只读属性/函数的方式实现
    private var accouontPath: String {
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        return (path as NSString).stringByAppendingPathComponent("account.plist")
    }
    //判断账户是否过期
    private var isExpired:Bool {
        //判断用户账户过期日期与当前系统日期进行比较
        
        //自己改写日期 测试逻辑是否正确 创建日期的时候 如果给定负数 返回比当前早的日期
//        account?.expiresDate = NSDate(timeIntervalSinceNow: -3600)
        
        //如果account为nil 不会调用后面的属性,后面的就不会去比较
        if account?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending{
            //比较是否过期
            return false
        }
        //如果过期返回true
        return true
    }
/// 构造函数
//    init() {
    //私有化 会要求外部只能通过单例常量
    private init() {
        //从沙盒中解档数据 恢复当前数据  磁盘的读写速度最慢
        account  = NSKeyedUnarchiver.unarchiveObjectWithFile(accouontPath) as? UserAccount
        //判断token是否过期
        if isExpired {
            print("已经过期")
            //如果过期 清空解档的数据
            account = nil
        }
//        print(account)
    }

}
extension UserAccountViewModel {
    func loadAccessToken(code: String, finished: (isSuccess: Bool) ->()) {
        NetworkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
                // 1. 判断错误
                if error != nil {
                    print("出错了")
                    
                    //失败的回调
                    finished(isSuccess: false)
                    return
                }
            //2,输出结果在 Swift 中任何 AnyObject 在使用前，必须转换类型 -> as ?/! 类型
            self.account = UserAccount(dict: result as! [String: AnyObject])
            self.loadUserInfo(self.account!,finished:finished)
        }
    }
    private func loadUserInfo(account: UserAccount,finished: (isSuccess: Bool) ->()) {
        NetworkTools.sharedTools.loadUserInfo(account.uid!) { (result, error) -> () in

            if error != nil {
                print("加载用户出错了")
                
                finished(isSuccess: false)
                return
            }
            //如果使用if let/ guard let 统统使用as?
            //做了两个判断 1.result 一定有内容 2.一定是字典
            guard let dict = result as? [String:AnyObject] else {
                print("格式错误")
                
                finished(isSuccess: false)
                return
            }
            //dict 一定是一个有值的字典
            //将用户信息保存
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            //保存对象 会调用对象的encodewithcode方法
            NSKeyedArchiver.archiveRootObject(account, toFile: self.accouontPath)
            print(self.accouontPath)
            
//            account.saveUserAccount()
            //需要完成回调
            finished(isSuccess: true)
        }
    }
    
    
    
    
    
    
}

    
    
